package msrc

import "net/http"

// livenessController реализует контроллер для обработки запросов
// liveness probe сервиса.
type livenessController struct {
	mainService MultiServiceInterface
}

// newLivenessService реализует конструктор сервиса для обработки запросов
// Liveness probe от Kubernetes. Под капотом использует HTTP сервер из net/http
// для реализации API проверки доступности.
func newLivenessService(
	port string,
	mainService MultiServiceInterface,
	ServerConfig ...*http.Server,
) ServiceInterface {
	controller := &livenessController{
		mainService: mainService,
	}

	mux := http.NewServeMux()
	mux.HandleFunc("/ready", controller.Ready)
	mux.HandleFunc("/alive", controller.Alive)

	if 0 == len(ServerConfig) {
		ServerConfig = append(ServerConfig, nil)
	}

	return HttpService(`0.0.0.0`, port, mux, 5, ServerConfig[0])
}

// Ready обрабатывает запросы к API для получения статуса готовности для
// Readyness Probe.
func (l *livenessController) Ready(writer http.ResponseWriter, _ *http.Request) {
	status := http.StatusOK
	message := `Ok`

	if !l.mainService.IsServicesRun() {
		status = http.StatusInternalServerError
		message = `Is not ready`
	}

	writer.WriteHeader(status)
	_, _ = writer.Write([]byte(message))
}

// Alive обрабатывает запросы к API для получения статуса работоспособности для
// Liveness Probe.
func (l *livenessController) Alive(writer http.ResponseWriter, _ *http.Request) {
	status := http.StatusOK
	message := `Ok`

	if !l.mainService.IsServicesAlive() {
		status = http.StatusInternalServerError
		message = `Is not ready`
	}

	writer.WriteHeader(status)
	_, _ = writer.Write([]byte(message))
}
